<template>
  <div class="container">
    <div class="main">
      <div class="pay-title">
        支付总金额
        <span class="pay-price"
          >￥ {{ Number(orderData.price).toFixed(2) }}</span
        >
      </div>
      <div class="pay-main">
        <h4>微信支付</h4>
        <el-row
          type="flex"
          justify="space-between"
          align="middle"
          class="pay-qrcode"
        >
          <div class="qrcode">
            <!-- 二维码 -->
            <canvas id="qrcode-stage" ref="canvas"></canvas>
            <p>请使用微信扫一扫</p>
            <p>扫描二维码支付</p>
          </div>
          <div class="pay-example">
            <img src="http://157.122.54.189:9093/images/wx-sweep2.jpg" alt="" />
          </div>
        </el-row>
      </div>
    </div>
  </div>
</template>

<script>
// 引入二维码插件
import QRCode from "qrcode";
export default {
  data() {
    return {
      orderData: {},
      timer: {}
    };
  },
  created() {},
  watch: {
    "$store.state.user.userInfo.token": {
      handler: function() {
        // 一进来就尝试一次,
        // 每当 token 有变化都会再次执行
        if (this.$store.state.user.userInfo.token) {
          // 1. 如果是别的页面进来, vuex 本来就有, 第一次执行就得出结果
          // 2. 如果是刷新, 一进来会执行一次, 发现没数据, 不会执行
          // 等到 vuex 被本地储存恢复, 发生变化,再次执行, 出现数据
          this.$axios({
            url: "/airorders/" + this.$route.query.id,
            headers: {
              Authorization: "Bearer " + this.$store.state.user.userInfo.token
            }
          }).then(res => {
            console.log(res.data);
            this.orderData = res.data;
            // 已经获取完了数据, 有了支付链接
            // 可以生成二维码了
            // QRCode.toCanvas 是生成二维码的函数
            // 其中接收两个必要参数,
            // 1. 是需要显示二维码的 canvas
            // 2. 是需要变为二维码的字符串
            // 第三个是一个可选的配置对象, 其中 width 属性可以控制宽度
            QRCode.toCanvas(this.$refs.canvas, res.data.payInfo.code_url, {
              width: 200
            });
            this.checkPay();
          });
        }
      },
      immediate: true
    }
  },
  methods: {
    checkPay() {
      this.$axios({
        url: "/airorders/checkpay",
        method: "POST",
        headers: {
          Authorization: "Bearer " + this.$store.state.user.userInfo.token
        },
        data: {
          id: this.orderData.id,
          // 订单id
          nonce_str: this.orderData.price,
          // 支付接口返回的订单金额
          out_trade_no: this.orderData.orderNo
          // 订单编号
        }
      }).then(res => {
        console.log(res.data);
        if (res.data.statusTxt === "订单未支付") {
          this.timer = setTimeout(() => {
            this.checkPay();
          }, 3000);
          console.log("订单未支付");
        } else if (res.data.statusTxt === "支付完成") {
          this.$message.success(res.data.statusTxt);
        }
        if (res.data.trade_state === " SUCCESS") {
          this.$message("支付成功");
        }

        // 微信支付流程
        if (res.data.trade_state === "REFUND") {
          this.$message("转入退款");
        }

        // if (res.data.trade_state === "NOTPAY") {
        //   this.$message("未支付");
        // }
        if (res.data.trade_state === "CLOSED") {
          this.$message("已关闭");
        }
        if (res.data.trade_state === "REVOKED") {
          this.$message("已撤销");
        }
        if (res.data.trade_state === "USERPAYING") {
          this.$message("用户支付");
        }

        if (res.data.trade_state === "PAYERROR") {
          this.$message("支付失败");
        }
      });
    }
  },
  destroyed() {
    // 跳出页面的时候销毁定时器
    clearTimeout(this.timer);
  }
};
</script>

<style scoped lang="less">
.container {
  background: #f5f5f5;
  padding: 30px 0;

  .main {
    width: 1000px;
    margin: 0 auto;

    .pay-title {
      text-align: right;
      span {
        font-size: 28px;
        color: orangered;
      }
    }

    .pay-main {
      background: #fff;
      margin-top: 10px;
      border-top: 5px orange solid;
      padding: 30px;

      h4 {
        font-size: 28px;
        font-weight: normal;
        margin-bottom: 10px;
      }

      .pay-qrcode {
        padding: 0 80px;
      }

      .qrcode {
        border: 1px #ddd solid;
        padding: 15px;
        height: fit-content;

        #qrcode-stage {
          width: 200px;
          height: 200px;
          margin-bottom: 10px;
        }

        p {
          line-height: 2;
          text-align: center;
        }
      }
    }
  }
}
</style>
